package com.xie.leetcode.characterstring;

//有效的字母异位词
//        给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。
//
//        注意：若 s 和 t 中每个字符出现的次数都相同，则称 s 和 t 互为字母异位词。
//
//         
//
//        示例 1:
//
//        输入: s = "anagram", t = "nagaram"
//        输出: true
//        示例 2:
//
//        输入: s = "rat", t = "car"
//        输出: false
//         
//
//        提示:
//
//        1 <= s.length, t.length <= 5 * 104
//        s 和 t 仅包含小写字母
//         
//
//        进阶: 如果输入字符串包含 unicode 字符怎么办？你能否调整你的解法来应对这种情况？
//
//        相关标签
//        哈希表
//        字符串
//        排序
//
//        作者：力扣 (LeetCode)
//        链接：https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn96us/
//        来源：力扣（LeetCode）
//        著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

import java.util.Arrays;
import java.util.HashMap;

/**
 * @author xiezhendong
 * @date 2021/10/22
 */
public class IsAnagram {

    public static void main(String[] args) {
        IsAnagram isAnagram = new IsAnagram();
        System.out.println(isAnagram.isAnagram("anagram", "nagaram"));
        System.out.println(isAnagram.isAnagram("rat", "car"));
        System.out.println(isAnagram.isAnagram1("anagram", "nagaram"));
        System.out.println(isAnagram.isAnagram1("rat", "car"));
    }

    public boolean isAnagram1(String s, String t) {
        char[] sChar = s.toCharArray();
        char[] tChar = t.toCharArray();
        //对两个字符串中的字符进行排序
        Arrays.sort(sChar);
        Arrays.sort(tChar);
        return Arrays.equals(sChar, tChar);
    }

    public boolean isAnagram(String s, String t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null) {
            return false;
        }
        if (t == null) {
            return false;
        }
        if (t.equals(s)) {
            return true;
        }
        if ("".equals(s)) {
            return false;
        }
        if ("".equals(t)) {
            return false;
        }
        if (s.length() != t.length()) {
            return false;
        }

        char[] sChars = s.toCharArray();
        HashMap<String, Integer> sCharsMap = new HashMap<>();
        for (char sChar : sChars) {
            String v = String.valueOf(sChar);
            sCharsMap.merge(v, 1, Integer::sum);
        }

        char[] tChars = t.toCharArray();
        for (char tChar : tChars) {
            String v = String.valueOf(tChar);
            if (sCharsMap.get(v) != null) {
                sCharsMap.put(v, sCharsMap.get(v) - 1);
            }
        }

        for (Integer value : sCharsMap.values()) {
            if (value != 0) {
                return false;
            }
        }

        return true;
    }


}
